<script>
  // 不限数量参数
  function add() {
    // 第一次执行时，定义一个数组专门用来存储所有的参数
    var _args = Array.prototype.slice.call(arguments)
    // 在内部声明一个函数，利用闭包的特性保存_args并收集所有的参数值
    var _adder = function () {
      _args.push(...arguments)
      return _adder
    }
    // 利用toString隐式转换的特性，当最后执行时隐式转换，并计算最终的值返回
    _adder.toString = () => _args.reduce((a, b) => a + b, 0)
    return _adder
  }
  console.log(add(1, 2, 3).toString()) // 6

</script>